科研小知识 | 讲究!用 Python 制作词云图学问多着呢
The following article is from 数据Seminar Author 快点关注→
目录
前言
Python 词云生成工具
pyecharts —— 简单易用但不够美观
wordcloud —— 使用最多的的词云库
stylecloud —— 最接近完美的 Python 词云库
(1)词云形状
(2)配色方案
(3)字体
总结
Part1前言
文本可视化是一个话题极少的数据可视化研究方向,但只要讲到它,大家第一时间想到的应该就是“词云图”了吧。“词云”就是通过形成“关键词云层”或“关键词渲染”,对文本中出现频率较高的关键词进行视觉上的突出。词云图过滤掉大量的文本信息,使浏览者只要一眼扫过词云图就可以领略文本的主旨。
上期文章我们为大家介绍了如何使用 Python 做文本词频分析,着重讲解了文本预处理和中文分词部分。那么本期文章我们就紧跟着上期文章的脚步,为大家介绍如何使用 Python 制作精美绝伦的词云图。
我们选用上期文章中使用到的 《“十四五”规划》作为词频统计和制作词云图的对象,出现频率较高的部分词语如下图所示:
公众号对话框内发送关键词“20221113”,即可获得本文词云所有资源!
Part2Python 词云生成工具
📌小贴士:
本文重点在第三部分:stylecloud 本文中代码的注释同样值得一看 词云图的词语分布(颜色,位置,方向)是随机的,即每次运行都可以得到一个全新的词云图,所以当不满意某个词云图时,不妨多运行几遍代码,一定会得到一个满意的。
1pyecharts —— 简单易用但不够美观
使用 pyecharts
生成词云图是一件非常简单的事情,只需要简单的几行代码即可。首先,pyecharts
需要的语料格式如下(也可以使用词语权重来替代词频):
[(词语1,词频1), (词语2,词频2)……]
根据词频统计 Excel 表(词频统计表如何制作可以参考上期文章)生成以上格式的代码如下:
# 所有词语词频统计结果
data1 = pd.read_excel('十四五规划词频统计表.xlsx')
df = data1.head(50) # 取前五十行,代表前 50 个词语
Words = [(w, f) for w,f in zip(df['词语'], df['词频'])]
# [('发展', 411),('建设', 349),('完善', 276),('体系', 252),……]
那么使用 pyecharts 生成词云图的代码如下,
wordcloud=WordCloud()
# 词云图轮廓(shape),可选参数有’circle’, ‘cardioid’, ‘diamond’, ‘triangleforward’, ‘triangle’, ‘pentagon’, ‘star’
wordcloud.add("", Words, shape='circle')
# 生成 html 文件
wordcloud.render("./词云图/pyecharts词云图.html")
打开生成的 html 文件即可看到生成的词云图,如下图所示:
我们相信,这种效果的词云图应该,可能,大概,或许不能入各位法眼……
2wordcloud —— 使用最多的的词云库
wordcloud
是使用Python 制作词云图使用最广泛的工具,但是使用它制作词云图并不是一件简单的事情:首先,在安装它的时候,就很有可能遇到麻烦,因为 wordcloud 库需要依赖 Microsoft Visual C++ 环境,需要事先安装该组件;其次,为了词云图的美观,使用过程中需要配合其他第三方库使用,比如 PIL
(用于加载背景图)。
wordcloud 可以接收多种格式的语料,可以是空格分隔的词语串,也可以是词语,词频组成的字典。下面我们使用词频统计 Excel 表构建字典语料,代码如下:
#上面已经读取了数据,这里不再重复读取
Words_dict = df.set_index('词语').to_dict()['词频']
# {'发展': 411,'建设': 349,'完善': 276,'体系': 252,……}
词云背景(形状)图使用下图(椭圆.png):
使用 wordcloud 生成词云图的代码如下:
from PIL import Image #图片处理
import matplotlib.pyplot as plt
from wordcloud import WordCloud
img = Image.open('椭圆.png') # 加载背景图片
img_array = np.array(img) # 将图片变为数组,便于用作词云图形状
wordcloud = WordCloud(
mask = img_array, # 设置背景图,上面已经加载
font_path="C:/Windows/Fonts/SimHei.ttf", #设置字体和大小,这里使用黑体
max_font_size = 70, # 词云图中词语字号最大值
min_font_size = 7, # 词云图中词语字号最小值
max_words=100, # 设置词语数量
repeat=True, # 当 max_words 超过总词数,是否使用重复的词语代替
background_color="white", # 设置背景颜色为白色
width=200, # 设置宽高
height=100
).generate_from_frequencies(Words_dict)
# 将词云图保存到本地
wordcloud.to_file('wordcloud词云图.png')
以上就是使用 wordcloud 生成的词云图了,实际效果也是比较不错的,它的优点是可以控制的参数很多,可以尽情 DIY(包括背景图,主题颜色,词语大小等等),缺点是代码较复杂,依赖的环境/工具较多。
3stylecloud —— 最接近完美的 Python 词云库
也是本文最想介绍的词云工具 !stylecloud是一款简单易用的 Python 词云生成第三方库,使用非常简单,但是得到的词云图却高级感十足。
📌小贴士:
事实上,stylecloud 是 wordcloud 的高级封装版本。这意味着 stylecloud 库需要依赖 wordcloud 库。这也是我们认为它接近完美而非真正完美的原因。
首先,我们认为影响词云图效果的因素有两大类,即语料和词云图形,其中语料的质量可以通过分词来控制;那么如何提高词云图形的质量呢?我们认为最影响词云图形的因素有以下 3 个:
词云形状 配色方案 字体
下面我们就从这三个方面入手,一步一步美化词云图。先使用 stylecloud 制作一个默认的词云,但在此之前需要构建语料 。stylecloud 需要的语料可以是词语列表、词语词频 csv 文件或词语词频 txt 文件,我们使用词频统计表的前 200 个词语来构建不同格式的语料,构建语料的代码如下(不熟练的小伙伴也可以手动填写词语和词频来生成语料):
# 取词频统计表的前 200 个词语
df = data1.head(200)
# 构建词语列表语料
All_words = []
[All_words.extend([w]*f) for w,f in zip(df['词语'], df['词频'])]
# 生成 csv 语料,将词频统计表另存为 csv 数据即可
df.to_csv('词频最高的200词.csv', index=False, encoding='utf-8')
# 生成 txt 语料
f = open('词频最高的200词.txt', 'a', encoding='utf-8')
for word,frequancy in zip(df['词语'], df['词频']):
f.writelines(word + ' ' + str(frequancy) + '\n')
f.close()
生成的语料展示如下(使用记事本打开后):
使用 stylecloud 库(使用默认参数)生成词云图的代码和词云图如下:
# 导入 stylecloud 库
from stylecloud import gen_stylecloud
# 使用上面得到的 csv 语料生成词云图
# 除必要参数外尽量不使用其他参数
gen_stylecloud(
file_path='词频最高的200词.csv', # 必要参数,语料的路径,如果语料是列表格式,则改用 text 参数
size=(600,600), # 词云图的长宽,设置更大的数字可以增加成图的分辨率,但代码运行时间会随之增加
max_words=200, # 词云图中的最大词语数量
max_font_size=120, # 词云图中字号的最大值
font_path=r'C:\Windows\Fonts\SimHei.ttf', # 字体是必要的参数,否则中文会显示异常
output_name='StyleClond词云图.png', # 必要参数,保存词云图的路径
)
一面旗!使用默认参数生成的词云图还是非常不错的,另外,从词语数量的增多可以看出,使用更多的词语可以使词云图更加饱满,视觉效果更佳。
下面我们将逐步修改词云形状,配色方案和字体来 DIY 一个更令人满意的词云图。
(1)词云形状
stylecloud 词云形状使用特定网站(https://fa5.dashgame.com/#/
)中的图标,进入该网站,滚动鼠标下拉找到【查看图标】,点击进入后即可在 1600+ 图形中选择中意的形状,选择图形后,点击图形右上角即可复制图形的名称,如下图所示:
我们再将复制到的内容赋给参数 icon_name
即可生成这个形状的词云,代码如下:
gen_stylecloud(
file_path='词频最高的200词.csv', # 必要参数,语料的路径,如果语料是列表格式,则改用 text 参数
size=(600,600), # 词云图的长宽,设置更大的数字可以增加成图的分辨率,但代码运行时间会随之增加
max_words=200, # 词云图中的最大词语数量
max_font_size=120, # 词云图中字号的最大值, 默认值是 200
font_path=r'C:\Windows\Fonts\SimHei.ttf', # 字体是必要的参数,否则中文会显示异常
output_name='./美化/StyleClond词云图.png', # 保存词云图的路径
icon_name='fas fa-cloud' # 设置词云形状为云朵,设置此参数后,系统会到自动到网页端获取对应的背景图
另外,再添加参数 invert_mask=True
还可以将形状反转,(代码省略)直接展示结果:
(2)配色方案
配色方案将直接影响词云图的观感,在展示某些主题下的文本词云时,可以选择合适的配色。比如当我们制作与海洋产业有关系的文本词云时,可以设置主题颜色为蓝色/绿色/青色系列颜色。stylecloud 中词云的配色可以由 Python 配色工具库 palettable
来提供,其默认的配色方案也是由palettable 所提供的。我们找到了民间大神整理的配色方案PDF文档,文档中部分配色方案如下图所示:
如果想要使用图中的配色方案,只需在生成词云的代码前面声明(使用上图中左侧的代码)即可,例如,我们使用上图中 Blues_7 蓝色配色方案,声明配色方案的代码如下:
# 导入配色方案库
import palettable
palettable.colorbrewer.sequential.Blues_7
# 下面在添加生成词云的代码即可
此外,假如配色方案中没有我们喜欢的配色方案,那么我们还可以自定义配色方案,将选择的颜色填入一个列表,再将颜色列表赋给参数 colors 即可。那么如何选择颜色呢?我们为大家推荐一个可以 DIY 的无广告调色网页(http://www.ku51.net/rgbhex.html
)。该网页支持用户自己调色(通过控制 R.G.B 颜色权重)来生成对应颜色的十六进制代码,如下图所示:
也可以在已有的几百种颜色中进行选择,如下图所示:
选中颜色后只需将对应的颜色代码填入 colors 参数列表中即可。我们选择几种较浅的暖色系颜色组成一个配色方案,代码如下:
gen_stylecloud(
file_path='词频最高的200词.csv', # 必要参数,语料的路径,如果语料是列表格式,则改用 text 参数
size=(600,600), # 词云图的长宽,设置更大的数字可以增加成图的分辨率,但代码运行时间会随之增加
max_words=200, # 词云图中的最大词语数量
max_font_size=120, # 词云图中字号的最大值, 默认值是 200
font_path=r'C:\Windows\Fonts\SimHei.ttf', # 字体是必要的参数,否则中文会显示异常
output_name='StyleClond词云图_NS.png', # 保存词云图的路径
icon_name='fas fa-cloud', # 词云形状
# 自定义颜色列表
colors=['#FFDAB9', '#FFE4E1', '#FFC1C1', '#CDCDB4', '#EECBAD']
)
除了颜色的变化,我们还可使用参数 gradient
来控制词云图色温变化的梯度,当不使用这个参数时,每个词语的颜色是可用颜色中随机的一种。也就是上面词云图中混乱无序的样子。当我们将gradient 参数设置为任意非空字符串,就可以使词云图中的颜色分布按照色温,色深沿着特定方向变化,效果非常 Nice。代码如下(注意参数 size变为整数,否则会报错):
gen_stylecloud(
file_path='词频最高的200词.csv', # 必要参数,语料的路径,如果语料是列表格式,则改用 text 参数
size=600, # 词云图的长宽,设置更大的数字可以增加成图的分辨率,但代码运行时间会随之增加
max_words=200, # 词云图中的最大词语数量
max_font_size=200, # 词云图中字号的最大值, 默认值是 200
font_path=r'C:\Windows\Fonts\SimHei.ttf', # 字体是必要的参数,否则中文会显示异常
output_name='./美化/StyleClond词云图_SW.png', # 保存词云图的路径
icon_name='fas fa-cloud', # 词云形状
palette='cartocolors.qualitative.Bold_5', # 配色方案,由于前面声明了其他的配色方案(Blues_7),
# 我们这里重新指定配色为 Bold_5,这也是默认的配色)
gradient='颜色渐变666', # 是否渐变色,可以是任意非空字符,为空字符时该参数不生效
)
(3)字体
使用不同字体同样可以优化词云图的观感,对 Windows 用户来说,选择字体并不难,系统字体默认的存储路径为:C:\Windows\Fonts\
,找到这个文件夹就可以查看系统中的字体,双击字体图标可以预览字体,不过很多字体并没有对中文做优化,因此设置后可能存在无法显示的情况。预览字体的截图如下:
鼠标右击图标后选择【属性(R)】可以查看该字体文件的名称,如下图所示:
我们使用 【微软雅黑】 字体(字体名为 msyhbd.ttc,使用 font_path
参数设置字体路径)重新生成一个词云(由于字体加粗,我们将最大词数由 200 减少到 150)。最大字号下调至 150,图片尺寸由 600 调整为 1000,这个操作可以提高词云图的分辨率,防止小词语模糊不清。代码如下:
gen_stylecloud(
file_path='词频最高的200词.csv',
size=1000,
max_words = 150,
max_font_size = 150,
font_path=r'C:\Windows\Fonts\msyhbd.ttc', # 使用此参数指定字体
output_name='./美化/StyleClond词云图_ZT.png',
icon_name = 'fas fa-cloud',
palette = 'cartocolors.qualitative.Bold_5',
)
公众号对话框内发送关键词“20221113”,即可获得本文词云所有资源!
Part3总结
本期文章我们为大家详细介绍了如何使用 Python 制作词云图,在制图过程中,我们可以通过设置不同的参数来改变词云的形状、配色、字体、词数等词云图要素。学习这些之后,我们就可以自己动手,制作想要的词云图了。希望本文内容对大家有所帮助。
加入企研·社科大数据平台数据分享群,获取更多数据资源及新鲜资讯
星标⭐我们不迷路!
想要文章及时到,文末“在看”少不了!
往期推荐